﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GM.Model;
using GM.Model.SubSonic;
using SubSonic.Schema;

namespace GM.Forms
{
    public partial class AssetForm : Form
    {
        private readonly NewAssetForm m_newAssetForm;
        private readonly AssetHistoryForm m_assetHistoryForm;
        private readonly DeleteAssetForm m_deleteAssetForm;
        private readonly MoveAssetForm m_moveAssetForm;

        private List<Pracownik> m_pracownicy;
        private List<faktury> m_faktury;
        private List<sale> m_sale;
        private List<gm_kst> m_kst;
        private List<gm_srodki_trwale_ruchy> m_ruchy;

        private ReportForm reportf = new ReportForm();

        public AssetForm()
        {
            InitializeComponent();

            try
            {
                m_pracownicy = Pracownik.All().ToList();
                m_faktury = faktury.All().ToList();
                m_sale = sale.All().ToList();
                m_kst = gm_kst.All().ToList();
                m_ruchy = gm_srodki_trwale_ruchy.All().ToList();

                m_newAssetForm = new NewAssetForm(m_pracownicy, m_faktury, m_sale, m_kst) { Visible = false };
                m_newAssetForm.AssetAdded += NewAssetForm_AssetAdded;
                m_assetHistoryForm = new AssetHistoryForm(m_ruchy, m_pracownicy) { Visible = false };
                m_deleteAssetForm = new DeleteAssetForm { Visible = false };
                m_deleteAssetForm.DeleteRequested += DeleteAssetForm_DeleteRequested;
                m_moveAssetForm = new MoveAssetForm(m_pracownicy, m_sale) { Visible = false };

                backgroundWorker.RunWorkerAsync(true);
            }
            catch (Exception e)
            {
                MessageBox.Show("Błąd inicjalizacji okna środków trwałych: " + e.Message);
            }
        }

        private void DeleteAssetForm_DeleteRequested()
        {
            backgroundWorker.RunWorkerAsync(true);
        }

        private void NewAssetForm_AssetAdded()
        {
            backgroundWorker.RunWorkerAsync(true);
        }

        private void AssetForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            Hide();
        }

        private void olvAssets_SelectedIndexChanged(object sender, EventArgs e)
        {
            var asset = olvAssets.SelectedObject as gm_srodki_trwale;
            if (asset == null)
                return;
            lbl_dataAmortyzacji.Text = asset.data_amortyzacji;
            lbl_dataPrzyjecia.Text = asset.data_przyjecia;
            lbl_dataZakupu.Text = asset.data_zakupu;
            lbl_kst.Text = asset.KST_id.Value.ToString();
            lbl_nazwa.Text = asset.nazwa;
            lbl_nrEwidencyjny.Text = asset.nr_ewidencyjny.ToString();
            lbl_nrFabryczny.Text = asset.numer_fabryczny;
            lbl_nrFaktury.Text = asset.id_faktury.ToString();
            lbl_opis.Text = asset.opis;
            lbl_osobaOdpowiedzialna.Text = asset.OsobaOdpowiedzialna;
            lbl_rodzajAmortyzacji.Text = @"liniowa";
            lbl_umiejscowienie.Text = asset.umiejscowienie.ToString();
            lbl_umorzenie.Text = asset.umorzenie.ToString();
            lbl_wartosc.Text = asset.wartosc.ToString();
            ckbxDeleted.Checked = asset.zlikwidowany.HasValue ? asset.zlikwidowany.Value > 0 : false;
        }

        private void AssetForm_Load(object sender, EventArgs e)
        {
            backgroundWorker.RunWorkerAsync(true);
        }

        private void SetProgress(bool visible)
        {
            if (progressBar.InvokeRequired)
                progressBar.BeginInvoke((MethodInvoker)delegate { progressBar.Visible = visible; });
            else
                progressBar.Visible = visible;
        }

        private void LoadData()
        {
            try
            {
                olvAssets.ClearObjects();
                SetProgress(true);
                var assets = gm_srodki_trwale.All().ToList();
                m_pracownicy = Pracownik.All().ToList();
                var amortyzacje = gm_srodki_trwale_amortyzacje.All().ToList();
                var ruchy = gm_srodki_trwale_ruchy.All().ToList();
                m_ruchy = gm_srodki_trwale_ruchy.All().ToList();

                foreach (var asset in assets)
                {
                    asset.Amortyzacje =
                        new List<gm_srodki_trwale_amortyzacje>(
                            amortyzacje.Where(x => x.nr_ewidencyjny == asset.nr_ewidencyjny));
                    var personalia = m_pracownicy.FirstOrDefault(x => x.id_prac == asset.osoba_odpowiedzialna);
                    asset.OsobaOdpowiedzialna = personalia != null
                                                    ? string.Format("{0} {1}", personalia.imie, personalia.nazwisko)
                                                    : "brak danych";
                    var ruch = ruchy.Where(x => x.srodek_id == asset.nr_ewidencyjny).ToList();
                    foreach (var trwaleRuchy in ruch.Where(x => x.pracownik_id.HasValue))
                    {
                        var osoba = m_pracownicy.FirstOrDefault(x => x.id_prac == trwaleRuchy.pracownik_id);
                        if (osoba != null)
                            trwaleRuchy.Osoba = string.Format("{0} {1}", osoba.imie, osoba.nazwisko);
                    }
                }

                olvAssets.SetObjects(assets);
                SetProgress(false);

            }
            catch (Exception exception)
            {
                MessageBox.Show("Błąd ładowania danych z bazy: " + exception.Message);
            }
        }

        #region Menu

        private void tsmiHistory_Click(object sender, EventArgs e)
        {
            if (olvAssets.SelectedIndex == -1)
                return;
            m_assetHistoryForm.ShowHistory(olvAssets.SelectedObject as gm_srodki_trwale);
        }

        private void tsmiAddAsset_Click(object sender, EventArgs e)
        {
            if (m_newAssetForm.Visible)
                m_newAssetForm.BringToFront();
            else
                m_newAssetForm.Show();
        }

        private void tsmiMoveAsset_Click(object sender, EventArgs e)
        {
            var asset = olvAssets.SelectedObject as gm_srodki_trwale;
            if(asset == null)
            {
                MessageBox.Show("Wybierz środek trwały.");
                return;
            }
            if(asset.zlikwidowany.HasValue)
            {
                if (asset.zlikwidowany.Value > 0)
                {
                    MessageBox.Show("Nie można przenieść zlikwidowanego środka trwałego.");
                    return;
                }
            }
            m_moveAssetForm.MoveAsset(asset);
        }

        private void tsmiDeleteAsset_Click(object sender, EventArgs e)
        {
            if (olvAssets.SelectedIndex == -1)
                return;
            var asset = olvAssets.SelectedObject as gm_srodki_trwale;
            if (asset.zlikwidowany.HasValue)
            {
                if (asset.zlikwidowany.Value > 0)
                {
                    MessageBox.Show("Środek już został zlikwidowany.");
                    return;
                }
            }
            m_deleteAssetForm.Delete(asset);
        }
        #endregion

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var flag = (bool) e.Argument;
            if(flag)
            {
                LoadData();
            }
            else
            {
                LoadReport();
            }
            
        }

        private void stocktakingbtn_Click(object sender, EventArgs e)
        {
            //backgroundWorker.RunWorkerAsync(false);
            try
            {
                var adapter = new evolutionDataSetTableAdapters.gm_srodki_trwaleTableAdapter();
                evolutionDataSet.gm_srodki_trwaleDataTable table = adapter.GetData();
                reportf.Show("Inwentaryzacja_spis", table, "DataSet1");

            }
            catch (Exception exception)
            {
                MessageBox.Show("Błąd ładowania raportu " + exception.Message);
            }
        }

        private void LoadReport()
        {
            //try
            //{
            //    SetProgress(true);
            //    var adapter = new evolutionDataSetTableAdapters.gm_srodki_trwaleTableAdapter();
            //    evolutionDataSet.gm_srodki_trwaleDataTable table = adapter.GetData();
            //    if(reportf.InvokeRequired)
            //    {
            //        reportf.BeginInvoke((MethodInvoker) (() => reportf.Show("Inwentaryzacja_spis", table, "DataSet1")));
            //    }
            //    else
            //    {
            //        reportf.Show("Inwentaryzacja_spis", table, "DataSet1");
            //    }
                
            //    SetProgress(false);
            //}
            //catch (Exception exception)
            //{
            //    MessageBox.Show("Błąd ładowania raportu " + exception.Message);
            //}
        }
    }
}
